SQL-连接查询

连接查询语法

以下介绍语法均为99版基本使用语法

1
2
3
4
5
6
##99版,支持所有类型
select querylist
from Table1 ConnectType
join Table2
on Connection_requirements
where conditions #可无

通常为各表取别名,以壁面歧义,增加可读性。

ConnectType 可选 内连inner ,左外left ,右外right,全外full ,交叉连接cross,缺省时为inner

内连接

  • 等值连接

    连接条件为等值判断,从两个表中查询数据合并为一个表。

    示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #查询部门个数>3的城市名和部门个数(分组、筛选)
    select city, count(*)
    from departments d
    inner join locations l
    on l.location_id = d.location_id
    group by d.location_id
    having count(*) >3;

    #查询员工名、部门名、工种名,并按部门名降序(多表连接)
    select last_name,department_name,job_title
    from employees e
    inner join departments d
    on e.department_id = e.department_id
    inner join jobs j
    on e.job_id = j.job_id
    order by department_name desc;
  • 非等值连接

    除连接条件改变后,其余格式、用法与等值连接相同。

  • 自连接

    将一张表视为多张,在同一张表中查找信息进行匹配。

    示例:

    1
    2
    3
    4
    5
    #查找上级
    select e.last_name,m.last_name
    from employees e
    join employees m
    on e.manager_id = m.employee_id

外部连接

用于查询部分数据仅在一个表中存的情况

  1. 区分主从表,若从表中存在匹配对象,显示匹配的值;若无,显示null
  2. 查询结果为主表中的所有记录:结果= 内连结果 + 【主表记录-null】
  • 左/右外连接

    左外连接left时,join左侧为主表;右外连接right时,join右侧为主表

    1
    2
    3
    4
    5
    6
    use girls;
    select b.name
    from beauty b
    left join boys bo
    on bo.id = b.boyfriend_id
    where bo.id is null;

    使用时先根据求取目标,确定主表

  • 全外连接

    相当于将两个表分别进行左外、右外连接后将结果合并。(MYSQL不支持full

    1
    2
    3
    4
    5
    use girls;
    select b.* ,bo.*
    from beauty b
    full outer join boys bo
    on bo.id = b.boyfriend_id ;

    交叉连接

    相当于笛卡尔乘积

    示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #99交叉连接
    use girls;
    select b.name ,bo.boyName
    from beauty b
    cross join boys bo;

    #等效笛卡尔
    select b.name ,bo.boyName
    from beauty b, boys bo;